package com.cardone.platform.common.service;

import java.util.Date;
import java.util.List;

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.transaction.annotation.Transactional;

import com.cardone.common.cache.Caches;
import com.cardone.common.dto.PaginationDto;
import com.cardone.platform.common.dto.OperateLogDto;

/**
 * 操作日志服务
 *
 * @author yaohaitao
 */
public interface OperateLogService {
	/**
	 * spring bean id
	 */
	String BEAN_ID = "com.cardone.platform.common.service.OperateLogService";

	/**
	 * 保存:操作日志
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param saveOperateLog
	 *          操作日志对象
	 *
	 * @return 操作日志对象
	 */
	@Deprecated
	@Transactional
	@CacheEvict(value = OperateLogService.BEAN_ID, allEntries = true)
	<P> P saveByIdOrCode(final Class<P> mappedClass, final OperateLogDto saveOperateLog);

	/**
	 * 插入
	 *
	 * @param insertOperateLog
	 *          操作日志对象
	 *
	 * @return 影响行数
	 */
	@Transactional
	@CacheEvict(value = OperateLogService.BEAN_ID, allEntries = true)
	int insertByCode(final OperateLogDto insertOperateLog);

	/**
	 * 读取数据库当前时间及最大创建时间
	 *
	 * @param typeTypeCode
	 *          类别类别代码
	 * @param typeCode
	 *          类别代码
	 * @param code
	 *          代码
	 *
	 * @return 数据库当前时间及最大创建时间
	 */
	List<Date> readListBeginDateForMax(final String typeTypeCode, final String typeCode, final String code);

	/**
	 * 读取当天总数
	 *
	 * @param typeTypeCode
	 *          类别类别代码
	 * @param typeCode
	 *          类别代码
	 * @param code
	 *          代码
	 *
	 * @return 当天总数
	 */
	Integer readCountByCodeForToDay(final String typeTypeCode, final String typeCode, final String code);

	/**
	 * 更新数据：失效
	 *
	 * @param typeCode
	 *          类别代码
	 * @param code
	 *          代码
	 * @return 失效数量
	 */
	int updateEndDateForInvalid(final String typeCode, final String code);

	/**
	 * 读取数据库当前时间及最大创建时间
	 *
	 * @param typeTypeCode
	 *          类别类别代码
	 * @param typeCode
	 *          类别代码
	 * @param code
	 *          代码
	 * @param businessCode
	 *          业务代码
	 *
	 * @return 数据库当前时间及最大创建时间
	 */
	List<Date> readListBeginDateForMax(final String typeTypeCode, final String typeCode, final String code, final String businessCode);

	/**
	 * 删除
	 *
	 * @param deleteOperateLog
	 *          操作日志对象
	 *
	 * @return 影响行数
	 */
	@Deprecated
	@Transactional
	@CacheEvict(value = OperateLogService.BEAN_ID, allEntries = true)
	int deleteByIds(final OperateLogDto deleteOperateLog);

	/**
	 * 更新
	 *
	 * @param updateOperateLog
	 *          操作日志对象
	 *
	 * @return 影响行数
	 */
	@Deprecated
	@Transactional
	@CacheEvict(value = OperateLogService.BEAN_ID, allEntries = true)
	int updateByCode(final OperateLogDto updateOperateLog);

	/**
	 * 查询
	 *
	 * @param readOperateLog
	 *          操作日志对象
	 * @return 返回数据
	 */
	@Deprecated
	@Cacheable(value = OperateLogService.BEAN_ID, key = Caches.KEY_1)
	Integer readByCodeNqIdForCount(final OperateLogDto readOperateLog);

	/**
	 * 查询
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param findOperateLog
	 *          操作日志对象
	 * @return 返回对象
	 */
	@Deprecated
	@Cacheable(value = OperateLogService.BEAN_ID, key = Caches.KEY_2)
	<P> P findById(final Class<P> mappedClass, final OperateLogDto findOperateLog);

	/**
	 * 查询
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param findOperateLog
	 *          操作日志对象
	 *
	 * @return 返回对象
	 */
	@Deprecated
	@Cacheable(value = OperateLogService.BEAN_ID, key = Caches.KEY_2)
	<P> P findByCodeOrId(final Class<P> mappedClass, final OperateLogDto findOperateLog);

	/**
	 * 查询
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param findListOperateLog
	 *          操作日志对象
	 *
	 * @return 操作日志对象集合
	 */
	@Deprecated
	@Cacheable(value = OperateLogService.BEAN_ID, key = Caches.KEY_2)
	<P> List<P> findListByLikeCode(final Class<P> mappedClass, final OperateLogDto findListOperateLog);

	/**
	 * 分页
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param paginationOperateLog
	 *          操作日志对象
	 *
	 * @return 操作日志分页对象
	 */
	@Deprecated
	@Cacheable(value = OperateLogService.BEAN_ID, key = Caches.KEY_2)
	<P> PaginationDto<P> paginationByLikeCode(final Class<P> mappedClass, final OperateLogDto paginationOperateLog);
}